package com.ruoyi.basebill.service.impl.billIssue;

import com.ruoyi.basebill.domain.*;
import com.ruoyi.basebill.mapper.TWfzRemunerationMapper;
import com.ruoyi.basebill.service.billIssue.INzjffService;
import com.ruoyi.basebill.service.impl.WfzNzjffServiceImpl;
import com.ruoyi.basebill.service.impl.billIssue.util.BillIssueUtil;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service
public class NzjffService implements INzjffService {


    @Autowired
    private TWfzRemunerationMapper tWfzRemunerationMapper;

    @Autowired
    private BillIssueUtil billIssueUtil;

    @Autowired
    private WfzNzjffServiceImpl wfzNzjffService;

    @Override
    public int billIssue(Long billId,StringBuffer stringBuffer) {
        WfzNzjff wfzNzjff = new WfzNzjff();
        //首先根据传入的单据id，查找对应的数据
        TWfzRemuneration tWfzRemuneration = tWfzRemunerationMapper.selectTWfzRemunerationByFid(billId);
        //获取薪酬总表的单据头信息
        String fcompany = tWfzRemuneration.getFcompany();//组织
        String fperiod = tWfzRemuneration.getFperiod();//薪酬期间
        //获取当前登录的用户
        LoginUser loginUser = SecurityUtils.getLoginUser();
        String username = loginUser.getUsername();

        //根据组织和薪酬期间查找对应的年终奖发放数据
        WfzNzjff wfzNzjff1 = new WfzNzjff();
        wfzNzjff1.setFcompany(fcompany);
        wfzNzjff1.setFperiod(fperiod);
        List<WfzNzjff> nzjffs = wfzNzjffService.selectWfzNzjffList(wfzNzjff1);
//        //判断是否存在对应数据
//        if (nzjffs.size() == 0){
//            stringBuffer.append("<br/>"+ "单据"+ billId + "没有找到对应的【年终奖发放】单据！");
//            return 0;
//        }
//        //判断查找的状态是否为审核
//        wfzNzjff1 = wfzNzjffService.selectWfzNzjffByFid(nzjffs.get(0).getFid());
//        if (!wfzNzjff1.getFstate().equals("AUDIT")){
//            stringBuffer.append("<br/>"+ "单据"+ billId + "对应的【年终奖发放】单据状态不为审核！");
//            return 0;
//        }

        ArrayList<WfzNzjffentry> wfzNzjffentries = new ArrayList<>();

        //开始遍历薪酬总表的分录信息
        List<TWfzRemunerationentry> tWfzRemunerationentryList = tWfzRemuneration.getTWfzRemunerationentryList();
        if (tWfzRemunerationentryList != null && tWfzRemunerationentryList.size() >0){
            for (int i = 0; i < tWfzRemunerationentryList.size(); i++) {
                TWfzRemunerationentry tWfzRemunerationentry = tWfzRemunerationentryList.get(i);
                String gcostnumber = tWfzRemunerationentry.getFcostnumber();
                String fcostnumber = billIssueUtil.costNumber(gcostnumber);//成本中心
                String fcostname = tWfzRemunerationentry.getFcostname();//成本中心名称
                String fcostcompany = tWfzRemunerationentry.getFcostcompany();//成本中心所属财务组织


                //获取分录的结算方式
                String fjsfs = billIssueUtil.Jsfs(fcompany, gcostnumber);
                //成本中心属性：
                String costType = billIssueUtil.costType(gcostnumber);

                String fvourtype = tWfzRemunerationentry.getFvourtype();


                //记账公司
                //年终奖

                WfzNzjffentry wfzNzjffentry = new WfzNzjffentry();

                wfzNzjffentry.setFcostnumber(fcostnumber);
                wfzNzjffentry.setFcostname(fcostname);
                wfzNzjffentry.setFcostcompany(fcostcompany);
                wfzNzjffentry.setFjsfs(fjsfs);
                wfzNzjffentry.setFcbzxxz(costType);

                wfzNzjffentry.setFvourtype(fvourtype);

                wfzNzjffentries.add(wfzNzjffentry);//新增到单据分录
            }
        }
        //总人数就是薪酬总表里所有的人  合并纳税成本中心就是属性是同组织下合并纳税成本中心的人数 关联方就是非同组织和同组织下二级组织属性的
        //总人数
        BigDecimal zrs = BigDecimal.valueOf(wfzNzjffentries.size());
        //合并纳税成本中心人数
        int nscbzxrs = 0;
        //关联方人数
        int glf = 0;
        for (int i = 0; i < wfzNzjffentries.size(); i++) {
            WfzNzjffentry wfzNzjffentry = wfzNzjffentries.get(i);
            String fjsfs = wfzNzjffentry.getFjsfs();
            if ("同组织下合并纳税成本中心".equals(fjsfs)){
                nscbzxrs++;
            }
            if ("同组织下是二级组织".equals(fjsfs) || "非同组织".equals(fjsfs)){
                glf++;
            }
        }

        //开始赋值
        billIssueUtil.setBillNumber(wfzNzjff);//单据编号
        wfzNzjff.setFcompany(billIssueUtil.costNumber(fcompany));//组织
        wfzNzjff.setFperiod(fperiod);//薪酬期间
        wfzNzjff.setFzrs(zrs);//总人数
        wfzNzjff.setFnscbzxrs(BigDecimal.valueOf(nscbzxrs));//合并纳税成本中心人数
        wfzNzjff.setFglf(BigDecimal.valueOf(glf));//关联方人数
        wfzNzjff.setFcreator(username);//制单人
        wfzNzjff.setFcreatetime(new Date());//制单时间
        wfzNzjff.setFlastupdateuser(username);//最后修改人
        wfzNzjff.setFlastupdatetime(new Date());//最后修改时间
        wfzNzjff.setFstate("SAVE");//状态
        wfzNzjff.setFsourcebillid(String.valueOf(billId));//来源单ID
        wfzNzjff.setFiseas(0L);//是否同步至eas
        String pzz = billIssueUtil.getPzz(fcompany);//凭证字
        wfzNzjff.setFvourtype(pzz);
        //类型
        wfzNzjff.setWfzNzjffentryList(wfzNzjffentries);//设置单据分录

        int i = wfzNzjffService.insertWfzNzjff(wfzNzjff);
        return i;
    }
}
